# -*- coding: utf-8 -*-

"""
Created on Fri Jun  8 18:43:24 2018

@author: Administrator
"""
import dicom
import os
import sys
import pandas as pd
from agilepipe.log import Log_make

#%%
#查看文件夹下所有dicom文件的dicom信息
#--------------------------------------------以下内容为主函数的子逻辑
    
def path_monta(dir_path):
    #作用原理：此函数的目的是根据dir_path生成err_log_path。之所以稍显复杂，是为了保证主函数read_dcm_atrrib()
    #作用原理：能够既能使用在数据整理流程中，也能单独使用。
    #参数说明：dir_path意义同主函数同名参数。
    #返回值说明：
    #举例：
    #调用：
    #被调用：dcm_atrrib_read()
    #bug：
    path_str = ''
    alias_dir_path = dir_path
    if '_ready4d2n' in alias_dir_path :
        while True:
            path_elem = os.path.split(alias_dir_path)[1]
            if '_ready4d2n' in path_elem:
                break
            path_str = path_elem + '_' + path_str 
            alias_dir_path = os.path.split(alias_dir_path)[0]
        medi_path_monta = alias_dir_path.replace('_ready4d2n','_proc_notes') + os.sep + 'ready4d2n' + os.sep + path_str
    else:
        medi_path_monta = dir_path + os.sep
    return medi_path_monta

def pend_dict_assing(single_file_path,single_file_path_cut,dcm,pend_dict):
    
    #作用原理：将dicom实例中的属性添加到pend_dict这个词典中去，并返回。
    #参数说明：dcm是由dcm = dicom.read_file()得到的一个实例，
    #参数说明：pend_dict是以dcm属性名称为keys的词典。
    #返回值说明：
    #举例：
    #调用：
    #被调用：read_dcm_atrrib()
    #bug：
    for key in pend_dict.keys():
        try:
            pend_dict[key] = eval('dcm.' + key)
        except:
            pend_dict[key] = '???'
    pend_dict['File_name'] = single_file_path_cut
    pend_dict['File_size'] = str(os.path.getsize(single_file_path) // 1024) + 'KB'
    return pend_dict

	
	
#%%

def read_dcm_atrrib(dir_path):
    #作用原理：将dir_path文件夹内的所有dcm文件的关键属性读出来，放到一个excel中，以备查看。
    #参数说明：dir_path可是任何含有dcm文件的文件夹绝对路径。而且有递归技术，即使有很多层文件夹也可以实现遍历。
    #参数说明：在整个数据整理流程中，其应该是有unpack_and_copy()函数生成的*_ready4d2n文件夹
    #返回值说明：
    #举例：
    #调用：
    #被调用：
    #bug：
    i = 0; j = 0; k = 0;
    dcm_file_path = os.walk(dir_path)
    #用path_monta即：path_montage,用dir_path拼接需要的路径，既要使程序融合与数据处理流程，又可以单独使用
    print('aaaaaaaaaaaaaa')
    medi_path_monta = path_monta(dir_path)
    print('bbbbbbbbbbbbbb')
    err_log_path = medi_path_monta + '_' + sys._getframe().f_code.co_name + '_err_log.txt'
    excel_path = medi_path_monta + '_' + sys._getframe().f_code.co_name + '_dcm_atrrib.xlsx'
    #print(medi_path_monta)
    #print(err_log_path)
    #print(excel_path)
    col_name =  ['File_name','File_size','Modality','ImageType',\
                 'StudyInstanceUID','StudyID','StudyDate','StudyTime',\
                 'SeriesInstanceUID','SeriesNumber','SeriesDescription','SeriesDate','SeriesTime',\
                 'ProtocolName','SequenceName','ScanningSequence','ScanOptions','RepetitionTime','EchoTime',\
                 'Rows','Columns','SliceLocation','SpacingBetweenSlices','ImageOrientationPatient',\
                 'ImagePositionPatient','NumberOfFrames']
    pend_dict = dict(zip(col_name,col_name))
    #print(pend_dict)
    nifti_df = pd.DataFrame(columns=col_name)
    #遍历dcm_file_path中的所有条目
    for item in dcm_file_path:
        if len (item[2]) == 0:
            continue
        for file_name in item[2]:
            i = i + 1
            single_file_path = item[0] + os.sep + file_name
            #single_file_path_cut,用于传给pend_dict_assing(),赋给pend_dict['File_name']
            single_file_path_cut = single_file_path.replace(dir_path,'')
            print('i',i)
            #print(single_file_path)
            #print(single_file_path_cut)
            try:
                dcm = dicom.read_file(single_file_path)
            except:
                j = j + 1
                Log_make.python_err_log_write(err_log_path,file_name,i,j)
            else:
                k = k + 1
                print('k:' ,k)
                #print(single_file_path)
                #print(single_file_path_cut)
                pend_dict = pend_dict_assing(single_file_path,single_file_path_cut,dcm,pend_dict)
                #print(pend_dict)
                nifti_df = nifti_df.append(pend_dict,ignore_index=True)
    nifti_df.to_excel(excel_path,sheet_name='Sheet1')
	
#%%
#测试：dir_path = r'F:\fmri\zjj' ; dcm_atrrib_read(dir_path)
#测试：dir_path = r'H:\data\huxianzhang_ready4d2n\01\after' ; read_dcm_atrrib(dir_path)
#测试：
#dir_path = r'H:\data\huxianzhang_ready4d2n\01' ; read_dcm_atrrib(dir_path)